//
//  LWHomeTableViewController.swift
//  Swift-WeiBo
//
//  Created by 刘伟 on 16/7/9.
//  Copyright © 2016年 LWSpro. All rights reserved.
//

import UIKit
import SVProgressHUD


//  重用标记
private let HomeTableViewCellIdentifier = "HomeTableViewCellIdentifier"

class LWHomeTableViewController: LWVisitorTableViewController {

    //定义一个数组 来接收模型
    lazy var statusListViewModel: LWStatusListViewModel = LWStatusListViewModel()
    
    //MARK: - 上拉加载更多
    private lazy var pullUpView: UIActivityIndicatorView = {
        
        //自带菊花转
       let indicatorView = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.WhiteLarge)
        
        indicatorView.color = UIColor.blueColor()
        
        return indicatorView
        
        
    }()
    

    
    //MARK: - 告诉用户是否加载到了数据
    private lazy var tipLabel: UILabel = {
        
       let label = UILabel(textColor: .whiteColor(), titleFont: 12)
        
        label.backgroundColor = UIColor.orangeColor()
        label.textAlignment = .Center
        
        
        //默认隐藏 不隐藏的话,那么一开始就显示出来了 我们是要在'正在刷新'加载数据完毕之后 才显示这个label
        label.hidden = true
        
        return label
        
    }()
    
    
    
    
    
    
    
    
    
    
    
    //MARK: - 使用系统的下拉刷新
//    private lazy var pullDownView: UIRefreshControl = {
//        
//       let refreshCtr = UIRefreshControl()
//        
//        //添加下拉刷新事件
//        refreshCtr.addTarget(self, action: "pullDownRefresh", forControlEvents: UIControlEvents.ValueChanged)
//        
//        
//        return refreshCtr
//        
//    }()
//    
    
    //MARK: - 使用自定义的下拉刷新 仿系统的LWRefreshControl
    private lazy var pullDownView: LWRefreshControl = {
       
        let refreshCtr = LWRefreshControl()
        
        refreshCtr.addTarget(self, action: "pullDownRefresh", forControlEvents: .ValueChanged)
        
        
        return refreshCtr
        
    }()
    
    
    
    override func viewDidLoad() {
        
        super.viewDidLoad()

        if isLogin {
            
            
            
            aboutSetUpTableView()
            
            loadStatus()
            
            
            navgationInsertSubviewSubviewLabel()
            
        }else {//没有登录的时候
            
            visitorView?.upDataVisitorImageAndLabel(nil, imageName: nil)
            
            
        }
        
        
        
        
    }

 
    
    //MARK: - '正在刷新'完毕后,动画显示tipLabel
    //传入一个字符串 为tipLabel赋值 因为刷新完毕之后 要显示是否刷新到新数据了
    private func animationShowTipLabel(message: String) {
        
        //如果tipLabel是显示的  那么就不需要再去以动画的形式改变它的frame了  也就是不需要再执行后面的动画了
        if !tipLabel.hidden {
         
            //不需要再执行后面的了,因为显示就说明已经动画更改了其的frame
            return
            
        }
            
            //显示
            tipLabel.hidden = false
        
           //赋值  接收网络传回来的值
            tipLabel.text = message
        
            UIView.animateWithDuration(1.0, animations: { () -> Void in
                
                //竖直位置从什么位置到哪里
                self.tipLabel.transform = CGAffineTransformMakeTranslation(0, self.tipLabel.height)
                
                }) { (_) -> Void in  //完成之后
                    
                 UIView.animateWithDuration(1.0, animations: { () -> Void in
                    
                    //回原位
                    self.tipLabel.transform = CGAffineTransformIdentity
                    
                    
                    }, completion: { (_) -> Void in
                        
                        //动画执行完毕之后 隐藏
                        self.tipLabel.hidden = true
                        
                 })
                    
        }
        
        
        
        
    }
    
    
    
    
    
    
    //MARK: - 将tipLabel加到navgationController的View上
    private func navgationInsertSubviewSubviewLabel() {
        
        guard let nav = self.navigationController else {
            
            return
            
        }
        
        
        //在navigationController的View中插入tipLabel 位置放置 nav.navigationBar 的下面
        nav.view.insertSubview(tipLabel, belowSubview: nav.navigationBar)
        
        
        
        //布局 设置frame
        tipLabel.frame = CGRect(x: 0, y: 64 - 30, width: SCreenWidth, height: 30)
        
        
        
    }
    

    
    //MARK: - 注册cell 有关tableView的操作都在这里
    private func aboutSetUpTableView() {
    
    
      tableView.registerClass(LWStatusTableViewCell.self, forCellReuseIdentifier: HomeTableViewCellIdentifier)
        
        
        //消除每个cell之间的分割线
        tableView.separatorStyle = .None
        
        //预估cell的高度 这个方法是让系统根据约束自动设置行高 下面接上预估行高
        tableView.rowHeight = UITableViewAutomaticDimension
        //预估高度越接近真实值越好
        tableView.estimatedRowHeight = 200
    
        
        //集成系统的下拉刷新  两种方式
        //第一种  直接设置UITableViewController里的refreshControl的属性
//        self.refreshControl = pullDownView
        
        
        //第二种  如果控制器不是UITableViewController  那么下拉刷新 就肯定有UITableView  这时我们就将UIRefreshControl 添加到UITableView 中  一样能集成下拉刷新 其实第一种本质就是走了第二种  只是不需要我们手动添加
//        tableView.addSubview(pullDownView)
        
        
        
        //以上两种都是系统的  模式太古板 我们现在来仿照系统的  自定义一个下拉刷新的UIRefreshControl  和UIRefreshControl一样 继承自 UIControl 也即是和UIRefreshControl平级
        tableView.addSubview(pullDownView)
        
        
        //下拉加载更多  将pullUpView给footView
        tableView.tableFooterView = pullUpView
        
    
    }
    
    
    //MARK: - 关闭加载动画和刷新动画
    private func endRefreshing() {
        
        //关闭菊花转
        self.pullUpView.stopAnimating()
        
        //关闭下拉刷新的菊花转
        pullDownView.endRefreshing()
        
        
    }
    
    
    
    //MARK: - 下拉刷新方法
    @objc private func pullDownRefresh() {
        
        //这时  pullUpView.isAnimating() = false
        
        //正在刷新 的状态下就会去加载数据
        loadStatus()
        
        
        
    }
    
    

    
    
    //MARK: - 发送网络请求,获取网络数据
    private func loadStatus() {
  
      
        
        //调用这个方法  那么  statusListViewModel 对象的数组属性就赋值了
        statusListViewModel.loadStatus(pullUpView.isAnimating()) { (isSuccess, message) -> () in

            //不是上拉加载更多 也即是下拉刷新时  我们就显示tipLabel 否则就显示默认的  隐藏
            if !self.pullUpView.isAnimating() {
                
                //无论加载到数据没有  网络传回的加载到什么内容 我们都赋值给tipLabel
                //所以这里只需调用 开启tipLabel的动画即可
                self.animationShowTipLabel(message)
                
                
            }
            
            
            //无论有没有数据回来都关闭加载和刷新的动画  这段在上面那个判断后面执行 不然上面那个判断相当于没写
            self.endRefreshing()
            
            if isSuccess {
                
                
                
                //刷新
                self.tableView.reloadData()

                
            }
            
            
        }
    
    
   }
    
    
    
    
}

///MARK: - 代理和数据源方法
extension LWHomeTableViewController {
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        
        //数组
        return statusListViewModel.statusList.count
        
    }
    
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        
        //需要注册cell 强转一下类型 这样才能使用属性
        let cell = tableView.dequeueReusableCellWithIdentifier(HomeTableViewCellIdentifier, forIndexPath: indexPath) as! LWStatusTableViewCell
        
        
        //让cell没有选择颜色
        cell.selectionStyle = .None
        
        
        //相当于set方法 赋值
        cell.statusViewModel = statusListViewModel.statusList[indexPath.row]
        
        
        return cell

        
    }
    
    
    override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
        
        if indexPath.row == self.statusListViewModel.statusList.count - 1 && !pullUpView.isAnimating() { //如果是最后一个cell  并且没有开启菊花转 那么就开启  开启了就不开启了  开启了就不会走这里面的方法  注意取了反
            
            pullUpView.startAnimating()
            
            //调用网络请求的方法
            loadStatus()
            
            
            
        }
        
        
        
        
        
    }
    
    
}








